/*
 * 
 * 
 * 
 */
package com.hboxs.asl.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;

import javax.persistence.*;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

/**
 * Entity - 订单项
 */
@Entity
@Table(name = "xx_order_item")
@SequenceGenerator(name = "sequenceGenerator", sequenceName = "xx_order_item_sequence")
public class OrderItem extends BaseEntity {

    private static final long serialVersionUID = -4999926022604479334L;



    /**
     * 商品编号
     */
    private String sn;

    /**
     * 商标题称
     */
    private String name;

    /**
     * 商品全称
     */
    private String fullName;

    /**
     * 商品价格
     */
    private BigDecimal price;

    /**
     * 商品重量
     */
    private Integer weight;

    /**
     * 商品缩略图
     */
    private String thumbnail;

    /**
     * 数量
     */
    private Integer quantity;

    /**
     * 已发货数量
     */
    private Integer shippedQuantity;

    /**
     * 已退货数量
     */
    private Integer returnQuantity;

    /**
     * 商品
     */
    private Product product;

    /**
     * 订单
     */
    private Order order;

    /**
     * 评论
     */
    private Set<Review> reviews = new HashSet<>();

    /**
     * 是否已评论
     */
    private Boolean hasReview;

    /**
     * 是否已申请退换货
     */
    private Boolean hasApplyReturn;

    /**
     * 主播
     */
    private Member anchor;

    /**
     * 退货记录
     */
    private ReturnsRecord returnsRecord;

    @OneToOne(mappedBy = "orderItem", fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    public ReturnsRecord getReturnsRecord() {
        return returnsRecord;
    }

    public void setReturnsRecord(ReturnsRecord returnsRecord) {
        this.returnsRecord = returnsRecord;
    }

    /**
     * 获取商品编号
     *
     * @return 商品编号
     */
    @JsonProperty
    @NotEmpty
    @Column(nullable = false, updatable = false)
    public String getSn() {
        return sn;
    }

    /**
     * 设置商品编号
     *
     * @param sn 商品编号
     */
    public void setSn(String sn) {
        this.sn = sn;
    }

    /**
     * 获取商标题称
     *
     * @return 商标题称
     */
    @JsonProperty
    @Column(nullable = false, updatable = false)
    public String getName() {
        return name;
    }

    /**
     * 设置商标题称
     *
     * @param name 商标题称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取商品全称
     *
     * @return 商品全称
     */
    @JsonProperty
    @Column(nullable = false, updatable = false)
    public String getFullName() {
        return fullName;
    }

    /**
     * 设置商品全称
     *
     * @param fullName 商品全称
     */
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    /**
     * 获取商品价格
     *
     * @return 商品价格
     */
    @JsonProperty
    @NotNull
    @Min(0)
    @Digits(integer = 12, fraction = 3)
    @Column(nullable = false, precision = 21, scale = 2)
    public BigDecimal getPrice() {
        return price;
    }

    /**
     * 设置商品价格
     *
     * @param price 商品价格
     */
    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    /**
     * 获取商品重量
     *
     * @return 商品重量
     */
    @JsonProperty
    @Column(updatable = false)
    public Integer getWeight() {
        return weight;
    }

    /**
     * 设置商品重量
     *
     * @param weight 商品重量
     */
    public void setWeight(Integer weight) {
        this.weight = weight;
    }

    /**
     * 获取商品缩略图
     *
     * @return 商品缩略图
     */
    @JsonProperty
    @Column(updatable = false)
    public String getThumbnail() {
        return thumbnail;
    }

    /**
     * 设置商品缩略图
     *
     * @param thumbnail 商品缩略图
     */
    public void setThumbnail(String thumbnail) {
        this.thumbnail = thumbnail;
    }


    /**
     * 获取数量
     *
     * @return 数量
     */
    @JsonProperty
    @NotNull
    @Min(1)
    @Max(10000)
    @Column(nullable = false)
    public Integer getQuantity() {
        return quantity;
    }

    /**
     * 设置数量
     *
     * @param quantity 数量
     */
    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    /**
     * 获取已发货数量
     *
     * @return 已发货数量
     */
    @Column(nullable = false)
    public Integer getShippedQuantity() {
        return shippedQuantity;
    }

    /**
     * 设置已发货数量
     *
     * @param shippedQuantity 已发货数量
     */
    public void setShippedQuantity(Integer shippedQuantity) {
        this.shippedQuantity = shippedQuantity;
    }

    /**
     * 获取已退货数量
     *
     * @return 已退货数量
     */
    @Column(nullable = false)
    public Integer getReturnQuantity() {
        return returnQuantity;
    }

    /**
     * 设置已退货数量
     *
     * @param returnQuantity 已退货数量
     */
    public void setReturnQuantity(Integer returnQuantity) {
        this.returnQuantity = returnQuantity;
    }

    /**
     * 获取商品
     *
     * @return 商品
     */
    @ManyToOne(fetch = FetchType.LAZY)
    public Product getProduct() {
        return product;
    }

    /**
     * 设置商品
     *
     * @param product 商品
     */
    public void setProduct(Product product) {
        this.product = product;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    public Member getAnchor() {
        return anchor;
    }

    public void setAnchor(Member anchor) {
        this.anchor = anchor;
    }

    /**
     * 获取订单
     *
     * @return 订单
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "orders", nullable = false, updatable = false)
    public Order getOrder() {
        return order;
    }

    /**
     * 设置订单
     *
     * @param order 订单
     */
    public void setOrder(Order order) {
        this.order = order;
    }

    /**
     * 获取评论
     *
     * @return 评论
     */
    @OneToMany(mappedBy = "orderItem", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    public Set<Review> getReviews() {
        return reviews;
    }

    /**
     * 设置评论
     *
     * @param reviews 评论
     */
    public void setReviews(Set<Review> reviews) {
        this.reviews = reviews;
    }

    /**
     * 获取是否已评论
     *
     * @return 是否已评论
     */
    @NotNull
    @Column(nullable = false)
    public Boolean getHasReview() {
        return hasReview;
    }

    /**
     * 设置是否已评论
     *
     * @param hasReview 是否已评论
     */
    public void setHasReview(Boolean hasReview) {
        this.hasReview = hasReview;
    }

    /**
     * 获取商品总重量
     *
     * @return 商品总重量
     */
    @JsonProperty
    @Transient
    public int getTotalWeight() {
        if (getWeight() != null && getQuantity() != null) {
            return getWeight() * getQuantity();
        } else {
            return 0;
        }
    }

    /**
     * 获取小计
     *
     * @return 小计
     */
    @JsonProperty
    @Transient
    public BigDecimal getSubtotal() {
        if (getPrice() != null && getQuantity() != null) {
            return getPrice().multiply(new BigDecimal(getQuantity()));
        } else {
            return new BigDecimal(0);
        }
    }

    /**
     * 获取是否已申请退货
     * @return 是否已申请退货
     */
    public Boolean getHasApplyReturn() {
        return hasApplyReturn;
    }

    /**
     * 设置是否已申请退货
     * @param hasApplyReturn 是否已申请退货
     */
    public void setHasApplyReturn(Boolean hasApplyReturn) {
        this.hasApplyReturn = hasApplyReturn;
    }

    /**
     * 退货申请状态
     * 0:申请中；1：拒绝；2：已处理；3：去退货
     * @return
     */
    @Transient
    public int getReturnsStatusValue(){
        return this.getReturnsRecord()==null ? 3 :this.getReturnsRecord().getStatus().ordinal();
    }
}